home *** CD-ROM | disk | FTP | other *** search
/ Ian & Stuart's Australian Mac 1993 September / September 93.iso / Archives / Applications / Graphics / graph / MacPhase 1.1.0 / Make Add-On Example / SimpleAddOn.p next >
Encoding:
Text File  |  1992-03-06  |  1.9 KB  |  100 lines  |  [TEXT/PJMM]

  1. unit SimpleAddOn;
  2. interface
  3.  
  4.     function main (info: ptr): ptr;
  5.  
  6. implementation
  7.  
  8.     type
  9.         IntegerPtr = ^Integer;
  10.         RealHandle = ^RealPtr;
  11.         RealPtr = ^RealArray;
  12.         RealArray = array[1..1] of real;
  13.  
  14.         MPTypePtr = ^MPType;
  15.         MPType = record
  16.                 data: Handle;
  17.                 mpVarCode: integer;
  18.                 width, height: longint;
  19.                 max, min: real;
  20.                 codeRefNum: integer;
  21.                 infoWindow: WindowPtr;
  22.             end;
  23.  
  24.     function main (info: ptr): ptr;
  25.         const
  26.             NewDataWindow = TRUE;
  27.         var
  28.             ok: boolean;
  29.             newData: Handle;
  30.             infoP: MPTypePtr;
  31.  
  32.  
  33. { • }
  34.  
  35.         procedure DoCalculation;
  36.             var
  37.                 x, y, xp: longint;
  38.                 mx, mn, num1, num2, ans: real;
  39.         begin
  40.             with infoP^ do
  41.                 begin
  42.                     mx := -1e20;
  43.                     mn := 1e20;
  44.                     HLock(data);
  45.                     for y := 1 to height - 1 do
  46.                         begin
  47.                             for x := 1 to width do
  48.                                 begin
  49.                                     xp := (y - 1) * width + x;
  50.                                     num1 := RealHandle(data)^^[xp];
  51.                                     xp := (y) * width + x;
  52.                                     num2 := RealHandle(data)^^[xp];
  53.                                     ans := (num1 - num2);
  54.                                     RealHandle(newData)^^[xp] := ans;
  55.                                     if ans > mx then
  56.                                         mx := ans;
  57.                                     if ans < mn then
  58.                                         mn := ans;
  59.                                 end;
  60.                         end;
  61.                     for x := 1 to width do
  62.                         begin
  63.                             RealHandle(newData)^^[x] := 0.0;
  64.                         end;
  65.                     min := mn;
  66.                     max := mx;
  67.                     HUnLock(data);
  68.                 end; { with }
  69.         end; { Normalize }
  70.  
  71. { • }
  72.  
  73.     begin
  74.         infoP := MPTypePtr(info);
  75.         ok := TRUE;
  76.  
  77.         if NewDataWindow then
  78.             begin
  79.                 newData := NewHandle(infoP^.width * infoP^.height * sizeof(real));
  80.                 ok := (MemError = noErr) and (newData <> nil);
  81.                 if ok then
  82.                     begin
  83.                         HLock(newData);
  84.                         HLock(infoP^.data);
  85.                         BlockMove(infoP^.data^, newData^, infoP^.width * infoP^.height * sizeof(real));
  86.                         HUnLock(infoP^.data);
  87.                         HUnLock(newData);
  88.                     end
  89.                 else
  90.                     SysBeep(0);
  91.             end;
  92.  
  93.         if ok then
  94.             DoCalculation;
  95.         if NewDataWindow and ok then
  96.             infoP^.data := newData;
  97.         Main := info;
  98.     end;    { main }
  99.  
  100. end.    { unit }